package com.free.beanutils;

import org.apache.commons.beanutils.Converter;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 功能概述: 枚举转换器
 * </p>
 * <p>
 * 功能详述: 
 * </p>
 */
public class EnumConverter implements Converter
{
    
    /*========================================================================*
     *                         Public Fields (公共属性)                                                                
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)                                                                
     *========================================================================*/

    /*========================================================================*
     *                         Construct Methods (构造方法) 
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)                                                                   
     *========================================================================*/

    @Override
    public <T> T convert(Class<T> type, Object value)
    {
        if(type.isEnum()){
            return convertToEnum(type,value);
        }
        return null;
    }
    
    /*========================================================================*
     *                         Private Methods (私有方法)                                                                   
     *========================================================================*/
    private <T> T convertToEnum(Class<T> type, Object value)
    {
        
        try
        {
            Method method = type.getDeclaredMethod("isEqual", value.getClass());
            List<T> res = Arrays.asList(type.getEnumConstants()).stream().filter(x->{
                try{
                    return (boolean)method.invoke(x, value);
                }
                catch(Throwable t){
                    return false;
                }
            }).collect(Collectors.toList());
            if(res != null && res.size() > 0)
            {
                return res.get(0);
            }
            return null;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
    
}

